home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / T U R B O Language / Turbo Pascal V7.0 / BREAKOUT.ZIP / WALLS.PAS < prev   
Pascal/Delphi Source File  |  1992-10-30  |  5KB  |  210 lines

  1. {************************************************}
  2. {                                                }
  3. {   Breakout Demo Program                        }
  4. {   Copyright (c) 1992 by Borland International  }
  5. {                                                }
  6. {************************************************}
  7.  
  8. unit Walls;
  9.  
  10. {
  11.   See BREAKOUT.PAS.
  12.   This unit defines the Wall object type.
  13.   It's a fairly complex object, because it plays such a
  14.   pivotal role in the game.
  15. }
  16.  
  17. interface
  18.  
  19. uses Screen, Bricks, Bounds, Crt;
  20.  
  21. type
  22.   BrickPtr = ^Brick;
  23.   BW = array[1..1000] of Brick;
  24.   WallPtr = ^BW;
  25.  
  26.   Wall = object(Obstacle)
  27.     BrickWall : WallPtr;
  28.     Height : Integer;
  29.     NumLeft : Integer;
  30.     Value : Integer;
  31.     NCells : Integer;
  32.     constructor Init(InitX, InitY, InitWidth, InitHeight : Integer);
  33.     destructor Done; virtual;
  34.     procedure Show; virtual;
  35.     procedure Hide; virtual;
  36.     function Collide(var B : Ball) : Boolean; virtual;
  37.     function GetValue : Integer; virtual;
  38.     procedure Reset;
  39.   end;
  40.  
  41. implementation
  42.  
  43. function RandomColor(MaxColors : Integer) : Integer;
  44. var
  45.   C : Integer;
  46. begin
  47.   C := Random(MaxColors);
  48.   while C = (TextAttr SHR 4) do
  49.     C := Random(MaxColors);
  50.   RandomColor := C;
  51. end;
  52.  
  53. procedure Beep;
  54. begin
  55.   Sound(100);
  56.   Delay(20);
  57.   NoSound;
  58. end;
  59.  
  60. { A wall is an array of bricks.  Its constructor actually builds a
  61.   conformant array, so we don't have to hardcode the size of the
  62.   wall. }
  63.  
  64. constructor Wall.Init(InitX, InitY, InitWidth, InitHeight : Integer);
  65. begin
  66.   Obstacle.Init(InitX, InitY, InitWidth, False);
  67.   Height := InitHeight;
  68.   NCells := Width*5;
  69.   GetMem(BrickWall, Width*Height*SizeOf(Brick));
  70.   Reset;
  71. end;
  72.  
  73. destructor Wall.Done;
  74. begin
  75.   FreeMem(BrickWall, Width*Height*SizeOf(Block));
  76. end;
  77.  
  78. { This procedure could be made simpler, but you wouldn't get the slick
  79.   effect you see when the wall is built. }
  80.  
  81. procedure Wall.Show;
  82. var
  83.   CurCol : Integer;
  84.   Count : Integer;
  85.   CurBlock : Integer;
  86. begin
  87.   Visible := True;
  88.   NumLeft := Width*Height;
  89.   for CurCol := 1 to Width + Height - 1 do
  90.     for Count := 0 to Height - 1 do
  91.     begin
  92.       CurBlock := CurCol + Count*(Width-1);
  93.       if (CurCol - Count >= 1) and (CurCol - Count <= Width) then
  94.       begin
  95.         BrickWall^[CurBlock].Show;
  96.         Delay(5);
  97.       end;
  98.     end;
  99.   GoToXY(X + (5*Width DIV 2) - 7, Y);
  100.   TextColor(WHITE);
  101.   Write('Turbo Breakout');
  102. end;
  103.  
  104. procedure Wall.Hide;
  105. var
  106.   CurCol : Integer;
  107.   Count : Integer;
  108.   CurBlock : Integer;
  109. begin
  110.   Visible := False;
  111.   for CurCol := 1 to Width + Height - 1 do
  112.     for Count := 0 to Height - 1 do
  113.     begin
  114.       CurBlock := CurCol + Count*(Width-1);
  115.       if (CurCol - Count >= 1) and (CurCol - Count <= Width) then
  116.       begin
  117.         if BrickWall^[CurBlock].IsVisible then
  118.         begin
  119.           BrickWall^[CurBlock].Hide;
  120.           Delay(5);
  121.         end;
  122.       end;
  123.     end;
  124. end;
  125.  
  126. function Wall.Collide(var B : Ball) : Boolean;
  127. var
  128.   CollideV, CollideH : Boolean;
  129.  
  130. { To check for a collision with a brick, first we check if the ball is in
  131.   the area where the wall is located, then we see if there's a brick that's
  132.   still visible at the ball's position.  If so, we destroy the brick, grab
  133.   its value, and beep. }
  134.  
  135. function CheckCollide(XPos, YPos : Integer) : Boolean;
  136. var
  137.   ThisBrick : BrickPtr;
  138. begin
  139.   CheckCollide := False;
  140.   if (YPos < Y) or (YPos > Y + Height - 1) or
  141.      (XPos < X) or (XPos > X + NCells - 1) then
  142.     Exit;
  143.   ThisBrick := @BrickWall^[1 + ((XPos-1) DIV 5) + Width*(YPos - 1)];
  144.   if ThisBrick^.IsVisible then
  145.   begin
  146.     CheckCollide := True;
  147.     Inc(Value, ThisBrick^.GetValue);
  148.     ThisBrick^.Hide;
  149.     Dec(NumLeft);
  150.     Beep;
  151.     if NumLeft = 0 then
  152.       Show;
  153.   end
  154. end;
  155.  
  156. { When checking for a collision with the wall, we have to watch out
  157.   for special cases involving corners. }
  158.  
  159. begin
  160.   Collide := False;
  161.   Value := 0;
  162.   CollideV := CheckCollide(B.X, B.NextY);
  163.   CollideH := CheckCollide(B.NextX, B.Y);
  164.   if CollideV then
  165.   begin
  166.     Collide := True;
  167.     B.ReverseY;
  168.   end;
  169.   if CollideH then
  170.   begin
  171.     Collide := True;
  172.     B.ReverseX;
  173.   end;
  174.   if not CollideV and not CollideH then
  175.     if CheckCollide(B.NextX, B.NextY) then
  176.     begin
  177.       Collide := True;
  178.       B.ReverseX;
  179.       B.ReverseY;
  180.     end;
  181. end;
  182.  
  183. function Wall.GetValue : Integer;
  184. begin
  185.     GetValue := Value;
  186. end;
  187.  
  188. procedure Wall.Reset;
  189. var
  190.   CurRow : Integer;
  191.   CurCol : Integer;
  192.   MaxColors : Integer;
  193. begin
  194.   if LastMode = Mono then
  195.     MaxColors := 4
  196.   else
  197.     MaxColors := 16;
  198.   NumLeft := Width*Height;
  199.   for CurRow := 0 to Height - 1 do
  200.     for CurCol := 0 to Width - 1 do
  201.       BrickWall^[CurRow*Width+CurCol+1].Init(X + CurCol*5,
  202.                                              Y + CurRow,
  203.                                              RandomColor(MaxColors),
  204.                                              Height - Y - CurRow + 1);
  205.   if Visible then
  206.     Show;
  207. end;
  208.  
  209. end.
  210.